<?php
/**
 * 获取和设置配置参数 支持批量定义
 * 如果$key是关联型数组，则会按K-V的形式写入配置
 * 如果$key是数字索引数组，则返回对应的配置数组
 * @param string|array $key 配置变量
 * @param array|null $value 配置值
 * @return array|null
 */
function SysC($key,$value=null){
    static $_config = array();
    $args = func_num_args();//当前函数参数数量。
    if($args == 1){//如果传入参数为1, 返回数组的值 相当于读取设置
        if(is_string($key)){  //如果传入的key是字符串
            return isset($_config[$key])?$_config[$key]:null;//返回数组$_config[$key];
        }
        if(is_array($key)){//如果传入的参数是数组
            if(array_keys($key) !== range(0, count($key) - 1)){  //如果传入的key是关联数组  键名不为数字。
                $_config = array_merge($_config, $key);//合并数组并赋值给$_config
            }else{//如果传入的key是数字索引数组。
                $ret = array();
                foreach ($key as $k) {
                    $ret[$k] = isset($_config[$k])?$_config[$k]:null;
                }
                return $ret;
            }
        }
    }else{//如果传入参数为2 就是给数组赋值 相当于设置
        if(is_string($key)){//如果传入参数是字符串
            $_config[$key] = $value;
        }else{
            Log::warn('传入参数不正确');
        }
    }
    return null;
}
/**
 * 终止程序运行
 * @param string $str 终止原因
 * @param bool $display 是否显示调用栈，默认不显示
 * @return void
 */
function halt($str, $display=false){
    Log::fatal($str.' debug_backtrace:'.var_export(debug_backtrace(), true));
    if($display){
        echo "<pre>";
        debug_print_backtrace();
        echo "</pre>";
    }
    echo $str;
    exit;
}
/**
 * 传入数组，偶数个则被赋值给$_GET 否则报错
 * @return array
 */
function inGet($arr){
    if(count($arr) % 2 === 0 && count($arr) >=2) {
        for($i=0;$i<count($arr);$i+=2){
            $_GET[strip_tags($arr[$i])] = $arr[strip_tags($i+1)];//剥去html php标签
        }
    }else{//如果传入参数非偶数，去除数组最后一个元素，再递归处理。
        if(!(count($arr) % 2) && count($arr) >=2){
            array_pop($arr);
            inGet($arr);
        }
    }
}

/**
 * 获取数据库实例
 * @param $conf array
 * @return medoo
 */
function M($conf = null){
    if(is_array($conf)){
        $dbobj = Db::getInstence($conf);
    }else{
        $dbobj = Db::getInstence(SysC('defaultDB'));
    }
    return $dbobj;
}
/**
 * 调用Widget
 * @param string $name widget名
 * @param array $data 传递给widget的变量列表，key为变量名，value为变量值
 * @return void
 */
function W($name, $data = array()){
    $fullName = $name.'Widget';
    if(!class_exists($fullName)){
        Log::fatal('Widget '.$name.'不存在');
    }
    $widget = new $fullName();
    $widget->invoke($data);
}
/**
 * 实例化子模型
 * @param $className string
 * @return object
 */
function D(){
    $model = sysC('c').'Model';
    $modelobj = new $model;
    return $modelobj;
}
/**
 * 获取过滤安全实例
 * @return object
 */
function R($type){
    $type = new $type();
    return $type;
}
/**
 * 如果文件存在就include进来
 * @param string $path 文件路径
 * @return void
 */
function includeIfExist($path){
    if(file_exists($path)){
        include $path;
    }
}
